/**
 * DRepServer.java
 *
 * @author Alex Tough (07-41604)
 * @author Carlos Colmenares (06-39380)
 *
 * Servidor que crea un objeto DRep y lo coloca en el registro
 * rmi para futuros usos, también se encarga de consultar por
 * cónsola comandos sobre el DRep.
 */

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import nanoxml.*;

public class DRepServer {

    public static DRepImpl miDRep;

    public static void main(String[] args) {

        //Ahora montamos el servicio RMI
        //En este string estará el URL con el cuál la clase
        //estará "enlazada" en el registro RMI
        String RMIURL="";
        try {
            miDRep = new DRepImpl(args);
            LocateRegistry.createRegistry(miDRep.getPuertoDRep());

            RMIURL = "rmi://localhost:"+miDRep.getPuertoDRep()+"/drep";

            Naming.rebind(RMIURL, miDRep);
            if(miDRep.isVerboso()){
                System.out.println("El DRep ha sido enlazado al "+
                        "registro RMI");
            }
        } catch (Exception e) {
            //System.err.println("Error en la ejecución de DRep en el puerto: "
            //        +miDRep.getPuertoDRep());
            e.printStackTrace();
            System.exit(1);
        }

        //Ahora se hace el prompt y se reciben comandos desde la consola
        try {

            BufferedReader in =
                new BufferedReader(
                        new InputStreamReader(System.in));

            while(true) {

                System.out.print("drep> ");


                String comando = in.readLine();

                comando = comando.trim();

                if(comando.length()==0)
                    continue;

                else if(comando.equals("ayuda")){
                    System.out.println(
                        "Ingrese el comando que desee que sea ejecutado, "+
                        "los comandos reconocidos son los siguientes:"
                    );
                    System.out.println();
                    System.out.println(
                        "\tayuda:    Imprime este menú"
                    );
                    System.out.println();
                    System.out.println(
                        "\tldir:     Se listarán los nombres y tamaños "+
                        "de cada uno de los archivos pertenecientes al "+
                        "directorio repositorio"        
                    );
                    System.out.println();
                    System.out.println(
                        "\tcat <nomb_archiv>: Lista por pantalla el "+
                        "contenido del archivo local <nomb_archiv> que "+
                        "debe estar en el repositorio"
                    );
                    System.out.println();
                    System.out.println(
                        "\tsalir:    Terminar el programa y todos sus hilos"
                    );

                }
                else if(comando.equals("salir")){
                    miDRep.desconectarDRep();
                    Naming.unbind(RMIURL);
                    break;
                }
                else if(comando.equals("ldir")){
                    String[] lista = miDRep.ldir();
                    for(int i=0;i<lista.length;i++){
                        System.out.println(lista[i]);
                    }
                }
                else if(comando.startsWith("cat ")){
                    String nombreDeArchivo = comando.substring(3);
                    nombreDeArchivo = nombreDeArchivo.trim();
                    leerYEscribirArchivo(nombreDeArchivo);
                }
                else {
                    System.out.println("Comando no reconocido, introduzca "+
                        "'ayuda' para más información"); 
                }
            }
            in.close();
            System.exit(0);

        } catch(DMonException e) {
            System.err.println("Error comunicando con el DMon");
        } catch(IOException e) {
            System.err.println("Error de Entrada/Salida");
            e.printStackTrace();
            System.exit(1);
        } catch(java.rmi.NotBoundException e){
            System.err.println("Error con el registro RMI");
            System.err.println(e);
        }
    }

    /**
     * Abre un archivo y lo imprime por la salida estandard
     * @param nombreDeArchivo Nombre del archivo a leer
     */
    public static void leerYEscribirArchivo(String nombreDeArchivo)
        throws IOException
    {

        File archivo = new File(miDRep.getRepositorio().getName()+"/"
                +nombreDeArchivo);

        if(!archivo.exists() || !archivo.isFile()){
            System.out.println("Archivo no existente o inválido");
            return;
        }

        //Si el archivo es muy grande, abortar
        if( archivo.length() > Integer.MAX_VALUE/2 ){
            System.out.println("Archivo muy grande!");
            return;
        }

        byte[] streamDeBytes = new byte[(int)archivo.length()];

        FileInputStream fis = new FileInputStream(archivo);
        fis.read(streamDeBytes, 0, (int)archivo.length());

        fis.close();

        String str = new String(streamDeBytes);
        System.out.print(str);
    }

}
